﻿#region Copyright (c) 2009, Active Web Solutions Ltd.
// Copyright (c) 2009, Active Web Solutions Ltd
// All rights reserved.

// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:

// * Redistributions of source code must retain the above copyright
//   notice, this list of conditions and the following disclaimer.

// * Redistributions in binary form must reproduce the above copyright
//   notice, this list of conditions and the following disclaimer in the
//   documentation and/or other materials provided with the distribution.

// * Neither the name of Active Web Solutions Ltd nor the names of its
//   contributors may be used to endorse or promote products derived from
//   this software without specific prior written permission.

// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion

using System;
using System.Configuration;
using System.Diagnostics;
using System.ServiceModel;
using System.ServiceProcess;
using Aws.SocketShifter;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
            Debug.AutoFlush = true;

            string issuerName = ConfigurationManager.AppSettings["issuerName"];
            string issuerSecret = ConfigurationManager.AppSettings["issuerSecret"];
            string encryptedIssuerSecret = ConfigurationManager.AppSettings["encryptedIssuerSecret"];
            string servicePath = ConfigurationManager.AppSettings["servicePath"];

            // E.g. Azure shells are not interactive, but don't support Windows Services
            bool forceInteractive = ConfigurationManager.AppSettings["forceInteractive"] == "true";

            // Prefer an encrypted secret over a plaintext secret
            if (!string.IsNullOrEmpty(encryptedIssuerSecret))
            {
                issuerSecret = Util.MachineDecrypt(encryptedIssuerSecret);
            }

            // If no password has been provided, prompt the user
            if (string.IsNullOrEmpty(issuerSecret))
            {
                Console.Write("Please enter your issuer secret : ");
                issuerSecret = Console.ReadLine();
                // Save the encrypted secret for next time
                encryptedIssuerSecret = Util.MachineEncrypyt(issuerSecret);
                Util.SaveConfigurationSetting("encryptedIssuerSecret", encryptedIssuerSecret);
            }

            ServiceHost serviceHost = SocketShifterServer.CreateServiceHost(issuerName, issuerSecret, servicePath);

            if ((System.Environment.UserInteractive) || forceInteractive)
            {
                serviceHost.Open();

                Debug.WriteLine("SocketShifter Server.");
                Debug.WriteLine("Service Path: " + serviceHost.Description.Endpoints[0].Address);
                Debug.WriteLine("Press [Enter] to exit.");
                Console.ReadLine();

                serviceHost.Close();
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
			    { 
				    new SocketShifterServerService(serviceHost) 
			    };
                ServiceBase.Run(ServicesToRun);

            }
        }
    }
}
